package com.haigirl.inherit;

/*
  3 继承
  3.1在面向对象的思想的中，通过抽象和封装获取了描述对象的类；
  	
  	继承就是使用已有类派生需要新创建的类；继承是父子类之间的关系；
  	目的：代码复用；
  	通过继承可以使子类获取父类中允许继承的属性和行为；在此基础之上，再进行子类的抽象和封装。
  3.2 继承的语法
  	
  	语法：
   		继承是类与类之间的关系；继承的关键字是：extends
  		访问控制修饰符  其他修饰符 class 子类名 extends 父类名{
  			// 属性;
  			// 行为;
  		}
  	解析：
   		（1）继承是类与类之间的关系，关键字是extends；
 		（2）java中的继承是单继承，一个类只有一个直接父类；【简单性】
   			【C++是多继承，一个类可以有多个直接父类】
  		（3）父类中那些属性和行为可以被子类继承又父类中的访问控制修饰符决定；
  		（4）java中所有的类都是Object类的直接或间接子类；Object是java中的所有类根类；
  		（5）构造方法不能被继承；
  	代码[com.yuw.oop.extendsdemo.*]:
  		参见包：com.yuw.oop.extendsdemo中的所有类；
  		1.2 多态

 4 多态的概念

	多态：具有继承关系的父子之间表现出来的不同的行为状态；
	多态体现在以下两个方面：
		（1）重写和覆盖【从子类角度而言】
			子类的同名的方法或属性覆盖了父类的同名的方法和属性；
		（2）父类指代子类【从父类角度而言】
			用父类类型的变量指向子类的引用；

 4.1重写和覆盖
	
	重写：具有继承关系的父子类中，子类的同名方法覆盖父类的同名方法就是方法的重写；
	方法重写的条件：
		（1）方法名相同，参数列表也必须相同；
		（2）返回值类型相同或兼容【子类的返回值类型能够默认转换为父类的返回值】；
		（3）子类的方法的访问控制修饰符范围》=父类的被重写的方法的访问控制修饰符的范围
		（4）子类方法抛出的异常范围《=父类的被重写的方法抛出的异常范围；
	注意：
		（1）构造方法不能够被重写；
		（2）静态方法方法不能够被重写；
		（3）子类重写的方法一般使用  @Override 注解；如果不使用不影响重写；【推荐使用 @Override】
		（4）使用ide工具可以自动生成需要重写方法，右键--source--override and implements ...---然后选择需要重写方法
		（5）如果子类重写了父类的方法，则通过子类实例对象变量调用重写的方法执行的子类的重写方法，不会再默认调用从父类继承的方法；
		（6）如果在子类重写的方法中，还需要调用父类的被覆盖的方法，则可以通过  super.方法名() 的方式进行调用；
		
    属性覆盖 
	
	子类的属性也可以覆盖父类同名的属性；
	
	代码[com.yuw.oop.overridedemo.*]:
		参见包：com.yuw.oop.overridedemo包中的类；
		

	提示：
		重写是父子类之间的关系，是纵向的关系；国际矛盾
		重载一个类内部各个方法之间关系，是一种横向的关系； 内部矛盾
		
  4.1父类指代子类  

	使用父类变量指向子类的引用。【向上溯型和向下溯型、instanceof 关键字】
	语法：
		父类类型  变量名 = new 子类类型();
	解析：
		（1）=号左侧是父类类型；=号右侧是创建了子类的实例对象；
		（2）虽然是一个父类类型的变量，但是在内存中创建和存储的还是子类实例对象的内容；
		（3）如果子类重写了父类的行为方法，实例变量.行为方法 调用是子类的行为方法；
		（4）使用执行子类型的变量，不能调用子类新扩展的行为方法及属性【局限性】；只能调用继承自父类的行为方法或属性；

   (1) 向上溯型
	
	父类指向子类；
	
   (2) 向下溯型

	将以父类类型指向子类类型的变量通过强制转换的形式将其重新转换为子类类型；
	Person 父类，Student 子类；
	示例：
		Person per0 = new Student();
		// 向下溯型
		Student stu0 = (Student)per0;
	注意：
		（1）只有使用父类的变量指向子类的实例对象的变量；才能通过向下溯型重新强制转换为子类；
			否则，普通父类直接转换子类会报运行时错误；		
	代码[com.yuw.oop.overridedemo.*]:
		参见包：com.yuw.oop.overridedemo包中的类；

    instanceof关键字 

	instanceof关键字：用于判断某一实例变量是否是该类实例对象；【判断引用类型的变量的类型】
	语法：
		变量  instanceof 类名
	解析：
		（1）表达式运算结果是布尔类型；
		（2）一个对象类型的变量是该类以及该类的所有的直接或间接父类的类型。
 */

public class Inherit {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}
